/*
 * @文件描述: 电容屏的驱动，暂时用模拟I2C驱动
 * @版本: 
 * @作者: 周晨阳
 * @Date: 2021-01-26 15:06:59
 */
#include "TOUCH.h"
#ifndef WIN_SIM

#define IIC_delay 2
/****************************************************************************************
		电容屏 I2C 底层驱动


***************************************************************************************/

//*************************************************
//函数名称 : void Touch_Init(void)
//功能描述 : 设置触屏的IIC引脚,用软件模拟的方法实现IIC功能

//*************************************************
void Touch_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); //使能GPIOB时钟

    //GPIOB10,B11初始化设置
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;      //普通输出模式
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;     //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;       //上拉
    GPIO_Init(GPIOB, &GPIO_InitStructure);             //初始化
    IIC_SCL = 1;
    IIC_SDA = 1;
    //
    I2C1_Stop();
    printf("touch init done...\n");
}
void I2C1_Delay_us(u16 cnt)
{
    volatile u16 i;
    for (i = 0; i < cnt * 4; i++)
        ;
}

/************************************************
*	函 数 名: I2C_Start
*	功能说明: CPU发起I2C总线启动信号
在SCK高电平期间，SDA一个下降沿，即构成了IIC的起始信号
//START:when CLK is high,DATA change form high to low
**************************************************/
void I2C1_Start(void)
{
    SDA_OUT(); //sda线输出
    IIC_SDA = 1;
    IIC_SCL = 1;
    I2C1_Delay_us(4);
    IIC_SDA = 0; //START:when CLK is high,DATA change form high to low
    I2C1_Delay_us(4);
    IIC_SCL = 0; //钳住I2C总线，准备发送或接收数据
}

/****************************************************
*	函 数 名: I2C_Stop
*	功能说明: CPU发起I2C总线停止信号
在SCK高电平期间，SDA一个上升沿，即构成了IIC的终止信号
//STOP:when CLK is high DATA change form low to high
****************************************************/
void I2C1_Stop(void)
{
    SDA_OUT(); //sda线输出
    IIC_SCL = 0;
    IIC_SDA = 0; //STOP:when CLK is high DATA change form low to high
    I2C1_Delay_us(4);
    IIC_SCL = 1;
    IIC_SDA = 1; //发送I2C总线结束信号
    I2C1_Delay_us(4);
}

/************************************** 
*	函 数 名: I2C_Ack
*	功能说明: CPU产生一个ACK信号
*	形    参：无
*	返 回 值: 无 
**************************************/
void I2C1_Ack(void)
{
    IIC_SCL = 0;
    SDA_OUT();
    IIC_SDA = 0;
    I2C1_Delay_us(2);
    IIC_SCL = 1;
    I2C1_Delay_us(2);
    IIC_SCL = 0;
}
/*
*************************************************
*	函 数 名: I2C_NoAck
*	功能说明: CPU产生1个NACK信号
*	形    参：无
*	返 回 值: 无
*************************************************
*/
void I2C1_NoAck(void)
{
    IIC_SCL = 0;
    SDA_OUT();
    IIC_SDA = 1;
    I2C1_Delay_us(2);
    IIC_SCL = 1;
    I2C1_Delay_us(2);
    IIC_SCL = 0;
}
/*************************************************************
*	函 数 名: I2C_WaitAck
*	功能说明: CPU产生一个时钟，并读取器件的ACK应答信号
*	形    参：无
*	返 回 值: 返回0表示正确应答，1表示无器件响应
*************************************************************/
uint8_t I2C1_WaitAck(void)
{
    u8 ucErrTime = 0;
    SDA_IN(); //SDA设置为输入
    IIC_SDA = 1;
    I2C1_Delay_us(1);
    IIC_SCL = 1;
    I2C1_Delay_us(1);
    while (READ_SDA)
    {
        ucErrTime++;
        if (ucErrTime > 250)
        {
            I2C1_Stop();
            return 1;
        }
    }
    IIC_SCL = 0; //时钟输出0
    return 0;
}

void I2C1_Send_Byte(uint8_t dat)
{
    u8 t;
    SDA_OUT();
    IIC_SCL = 0; //拉低时钟开始数据传输
    for (t = 0; t < 8; t++)
    {
        IIC_SDA = (dat & 0x80) >> 7;
        dat <<= 1;
        I2C1_Delay_us(2); //对TEA5767这三个延时都是必须的
        IIC_SCL = 1;
        I2C1_Delay_us(2);
        IIC_SCL = 0;
        I2C1_Delay_us(2);
    }
}

/************************************************
*	函 数 名: I2C_Read_Byte
*	功能说明: CPU从I2C总线设备读取8bit数据
*	形    参：无
*	返 回 值: 读到的数据
*************************************************/
//读1个字节，ack=1时，发送ACK，ack=0，发送nACK
uint8_t I2C1_Read_Byte(uint8_t ack)
{

    unsigned char i, receive = 0;
    SDA_IN(); //SDA设置为输入
    for (i = 0; i < 8; i++)
    {
        IIC_SCL = 0;
        I2C1_Delay_us(2);
        IIC_SCL = 1;
        receive <<= 1;
        if (READ_SDA)
            receive++;
        I2C1_Delay_us(1);
    }
    if (!ack)
        I2C1_NoAck(); //发送nACK
    else
        I2C1_Ack(); //发送ACK
    return receive;
}

/****************************************************************************************
电容屏 FT6336芯片驱动

***************************************************************************************/

uint8_t FT6206_Read_Reg(uint8_t *pbuf, uint32_t len)
{

    int8_t i = 0;

    I2C1_Start();
    I2C1_Send_Byte(FT6206_ADDR);
    I2C1_WaitAck();

    I2C1_Send_Byte(0);
    I2C1_WaitAck();
    I2C1_Stop();

    I2C1_Start();
    I2C1_Send_Byte(FT6206_ADDR + 1);
    I2C1_WaitAck();

    for (i = 0; i < len; i++)
    {
        if (i == (len - 1))
            *(pbuf + i) = I2C1_Read_Byte(0);
        else
            *(pbuf + i) = I2C1_Read_Byte(1);
    }
    I2C1_Stop();

    return 0;
}

static u8 a, buf[10];
volatile static int touchX = 0, touchY = 0, lastY = 0;

int get_MeasureX(void)
{
    FT6206_Read_Reg((uint8_t *)&buf, 7);

    if ((buf[2] & 0x0f) == 1)
    {
        touchX = (int16_t)(buf[5] & 0x0F) << 8 | (int16_t)buf[6];
        //touchY = (int16_t)(buf[3] & 0x0F) << 8 | (int16_t)buf[4];
        //		if(touchY==0)touchX=1000;
    }
    else
    {
        //touchY = 0xffff;
        touchX = 0xffff;
    }
    return touchX;
}

int get_MeasureY(void)
{
    FT6206_Read_Reg((uint8_t *)&buf, 7);

    if ((buf[2] & 0x0f) == 1)
    {
        //touchX = (int16_t)(buf[5] & 0x0F) << 8 | (int16_t)buf[6];
        touchY = ((int16_t)(buf[3] & 0x0F) << 8 | (int16_t)buf[4]);
        //printf("y:%d\n", touchY);
        //		if(touchY==0)touchX=1000;
    }
    else
    {
        touchY = 0xffff;
        //touchX = 0xffff;
    }
    return touchY;
}
/**
 * @brief :一次性获得xy坐标
 * @param {int} *x x坐标指针
 * @param {int} *y y坐标指针
 * @return {*}
 */
void getCoord(int *x, int *y)
{
    FT6206_Read_Reg((uint8_t *)&buf, 7);
    if ((buf[2] & 0x0f) == 1)
    {
        *x = (int16_t)(buf[5] & 0x0F) << 8 | (int16_t)buf[6];
        *y = ((int16_t)(buf[3] & 0x0F) << 8 | (int16_t)buf[4]);
    }
    else
    {
        *x = 0xffff;
        *y = 0xffff;
    }
}
void Touch_Test(void)
{
    int16_t x1, y1;

    while (1)
    {
        //		FT6206_Write_Reg1(0,0);
        //
        //		a = FT6206_Read_Reg1(0);
        //		GUI_DispDecAt(a, 0, 200, 4);
        //
        //		a = FT6206_Read_Reg1(0xa3);
        //		GUI_DispDecAt(a, 0, 0, 4);
        //
        //		a = FT6206_Read_Reg1(0xa6);
        //		GUI_DispDecAt(a, 100, 0, 4);
        //
        //		a = FT6206_Read_Reg1(0xa8);
        //		GUI_DispDecAt(a, 200, 0, 4);

        //		a = FT6206_Read_Reg1(0xa7);
        //		GUI_DispDecAt(a, 300, 0, 4);

        FT6206_Read_Reg((uint8_t *)&buf, 7);

        if ((buf[2] & 0x0f) == 1)
        {
            //读出的数据位480*800
            x1 = (int16_t)(buf[3] & 0x0F) << 8 | (int16_t)buf[4];
            y1 = (int16_t)(buf[5] & 0x0F) << 8 | (int16_t)buf[6];
        }
        else
        {
            x1 = 0xFFFF;
            y1 = 0xFFFF;
        }
        printf("x:%d,y:%d\n", x1, y1);
    }
}
#endif //
